import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

class SpUtil {
  static SharedPreferences? _prefs;

  /// 初始化，需在项目启动时调用
  static Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  static SharedPreferences get prefs {
    if (_prefs == null) {
      throw Exception('SpUtil未初始化，请先调用SpUtil.init()');
    }
    return _prefs!;
  }

  // 保存String
  static Future<bool> setString(String key, String value) async {
    return prefs.setString(key, value);
  }

  // 读取String
  static String? getString(String key) {
    return prefs.getString(key);
  }

  // 保存int
  static Future<bool> setInt(String key, int value) async {
    return prefs.setInt(key, value);
  }

  // 读取int
  static int? getInt(String key) {
    return prefs.getInt(key);
  }

  // 保存double
  static Future<bool> setDouble(String key, double value) async {
    return prefs.setDouble(key, value);
  }

  // 读取double
  static double? getDouble(String key) {
    return prefs.getDouble(key);
  }

  // 保存bool
  static Future<bool> setBool(String key, bool value) async {
    return prefs.setBool(key, value);
  }

  // 读取bool
  static bool? getBool(String key) {
    return prefs.getBool(key);
  }

  // 保存String列表
  static Future<bool> setStringList(String key, List<String> value) async {
    return prefs.setStringList(key, value);
  }

  // 读取String列表
  static List<String>? getStringList(String key) {
    return prefs.getStringList(key);
  }

  // 保存模型（对象需实现toJson方法）
  static Future<bool> setModel(String key, dynamic model) async {
    String jsonStr = jsonEncode(model);
    return prefs.setString(key, jsonStr);
  }

  // 读取模型（需要传入fromJson方法）
  static T? getModel<T>(String key, T Function(Map<String, dynamic>) fromJson) {
    String? jsonStr = prefs.getString(key);
    if (jsonStr == null) return null;
    Map<String, dynamic> map = jsonDecode(jsonStr);
    return fromJson(map);
  }

  // 保存模型列表
  static Future<bool> setModelList(String key, List<dynamic> modelList) async {
    String jsonStr = jsonEncode(modelList);
    return prefs.setString(key, jsonStr);
  }

  // 读取模型列表
  static List<T> getModelList<T>(
    String key,
    T Function(Map<String, dynamic>) fromJson,
  ) {
    String? jsonStr = prefs.getString(key);
    if (jsonStr == null) return [];
    List<dynamic> list = jsonDecode(jsonStr);
    return list.map((e) => fromJson(e as Map<String, dynamic>)).toList();
  }

  // 移除某个key
  static Future<bool> remove(String key) async {
    return prefs.remove(key);
  }

  // 清空所有数据
  static Future<bool> clear() async {
    return prefs.clear();
  }
}
